package com.company.genealogy.common.util;

import cn.hutool.json.JSONUtil;
import com.company.genealogy.common.constant.ApiCodeEnum;
import com.company.genealogy.common.result.ApiResponse;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @Description: 响应工具类，用于返回JSON字符串提示信息
 * 
 * 使用示例：
 * // 返回成功响应
 * ResponseUtil.success(response, "操作成功");
 * 
 * // 返回成功响应（带数据）
 * ResponseUtil.success(response, "查询成功", userList);
 * 
 * // 使用枚举返回成功响应
 * ResponseUtil.success(response, ApiCodeEnum.SUCCESS);
 * 
 * // 返回失败响应
 * ResponseUtil.error(response, "操作失败");
 * 
 * // 使用枚举返回失败响应
 * ResponseUtil.error(response, ApiCodeEnum.PARAM_ERROR);
 * 
 * @datetime: 2025/8/5   10:29
 * @author: chenzx
 */
public class ResponseUtil {

    /**
     * 返回成功响应
     * @param response HttpServletResponse对象
     * @param msg 成功消息
     */
    public static void success(HttpServletResponse response, String msg) {
        writeResponse(response, 200, msg, null);
    }

    /**
     * 返回成功响应（带数据）
     * @param response HttpServletResponse对象
     * @param msg 成功消息
     * @param data 返回数据
     */
    public static void success(HttpServletResponse response, String msg, Object data) {
        writeResponse(response, 200, msg, data);
    }

    /**
     * 返回成功响应（使用ApiCodeEnum）
     * @param response HttpServletResponse对象
     * @param codeEnum 状态码枚举
     */
    public static void success(HttpServletResponse response, ApiCodeEnum codeEnum) {
        writeResponse(response, codeEnum.getCode(), codeEnum.getMsg(), null);
    }

    /**
     * 返回成功响应（使用ApiCodeEnum + 数据）
     * @param response HttpServletResponse对象
     * @param codeEnum 状态码枚举
     * @param data 返回数据
     */
    public static void success(HttpServletResponse response, ApiCodeEnum codeEnum, Object data) {
        writeResponse(response, codeEnum.getCode(), codeEnum.getMsg(), data);
    }

    /**
     * 返回失败响应
     * @param response HttpServletResponse对象
     * @param code 错误码
     * @param msg 错误消息
     */
    public static void error(HttpServletResponse response, int code, String msg) {
        writeResponse(response, code, msg, null);
    }

    /**
     * 返回失败响应（默认错误码500）
     * @param response HttpServletResponse对象
     * @param msg 错误消息
     */
    public static void error(HttpServletResponse response, String msg) {
        writeResponse(response, 500, msg, null);
    }

    /**
     * 返回失败响应（使用ApiCodeEnum）
     * @param response HttpServletResponse对象
     * @param codeEnum 状态码枚举
     */
    public static void error(HttpServletResponse response, ApiCodeEnum codeEnum) {
        writeResponse(response, codeEnum.getCode(), codeEnum.getMsg(), null);
    }

    /**
     * 返回失败响应（使用ApiCodeEnum + 自定义消息）
     * @param response HttpServletResponse对象
     * @param codeEnum 状态码枚举
     * @param msg 自定义消息
     */
    public static void error(HttpServletResponse response, ApiCodeEnum codeEnum, String msg) {
        writeResponse(response, codeEnum.getCode(), msg, null);
    }

    /**
     * 写入响应到客户端
     * @param response HttpServletResponse对象
     * @param code 响应码
     * @param msg 消息
     * @param data 数据
     */
    private static void writeResponse(HttpServletResponse response, int code, String msg, Object data) {
        try {
            response.setContentType("application/json;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            
            ApiResponse<Object> apiResponse = new ApiResponse<>();
            apiResponse.setCode(code);
            apiResponse.setMsg(msg);
            apiResponse.setData(data);
            
            String jsonString = JSONUtil.toJsonStr(apiResponse);
            
            PrintWriter writer = response.getWriter();
            writer.write(jsonString);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
